package classes;

import java.util.regex.Pattern;
import javax.swing.text.*;

/**
 *
 * @since 2009.08.17
 */
public class FixedLengthDocument extends PlainDocument {

    private int iMaxLength;
    private Pattern DIGITS;
    public static final String NUMEROS = new String("\\d*");
    public static final String LETRAS = new String("[a-z|A-Z]*");
    public static final String ALL = new String(".*");

    /**
     * Cria uma nova instancia de FixedLengthDocument
     * @param maxlen a quantidade máxima de caracteres aceitos. (Valores menores
     * que zero = sem limite)
     * @param pattern o Pattern a ser aplicado.
     */
    public FixedLengthDocument(int maxlen, String pattern) {
        super();
        iMaxLength = maxlen;
        DIGITS = Pattern.compile(pattern);
    }

    @Override
    public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException {
        //se maior que zero, possui limite de caracteres
        if (iMaxLength > 0) {
            int ilen = (getLength() + str.length());
            // se o comprimento final for menor...
            if (ilen <= iMaxLength) {
                validar(offs, str, a); //aceita caractere
            } else {
                if (getLength() == iMaxLength) {
                    System.out.print(getClass());
                    System.out.println("-> String excedida: " + str + " com PATTERN: " + DIGITS);
                    return; // consome caractere (caractere não é inserido)
                }
                String newStr = str.substring(0, (iMaxLength - getLength()));
                String offStr = str.substring((iMaxLength - getLength()), str.length());
                validar(offs, newStr, a);
                System.out.print(getClass());
                System.out.println("-> String excedida: " + offStr +
                        " com PATTERN: " + DIGITS + " e limite: " + iMaxLength);
            }
        } else {
            validar(offs, str, a);
        }
    }

    /**
     * Insere a string se o caractere lido bater com o Pattern.
     * offs - the starting offset >= 0
     * str - the string to insert; does nothing with null/empty strings
     * a - the attributes for the inserted content
     * @throws BadLocationException
     */
    private void validar(int offs, String str, AttributeSet a)
            throws BadLocationException {
        if (str != null && DIGITS.matcher(str).matches()) {
            super.insertString(offs, str, a);
        } else {
            System.out.print(getClass());
            System.out.println("-> String Rejeitada: " + str + " com PATTERN: " + DIGITS);
        }
    }
}
